// TESTS PARA EL MAIN


#include "tupla.h"
#include "terna.h"
#include "cuaterna.h"
#include "aed2.h"
#include "diccarray.h"
#include "titulo.h"
#include "promesa.h"
#include "auxiliares.h"
#include "conjheap.h"
#include "diccTrie.h"
#include "wolfie.h"
#include <iostream>
#include <cassert>
#include <cstdlib>
#include <string>
#include <utility>

using namespace std;
using namespace aed2;

int main()
{
    cout << "Hello world!" << endl;

    Nat n = 5;
    tupla<int, int> t(2,2);
    //~ cout << t << endl;
    
    
    terna <int, int, int> te(1,41,3);
    //~ cout << te <<endl;
    
    terna <Dinero, Nat, Nombre> te2(1,41,"hola");
    //~ cout << te2 <<endl;
    
    cuaterna <int,int,int,int> c1(1,3,4,41);
    //~ cout<< c1<<endl;
    
    Titulo t1("ypf", 34,5);
    
    //~ cout<< t1 <<endl;
    t1.recotizar(56);
    //~ cout<< t1 <<endl;
    t1.recotizar(15);
    //~ cout<< t1 <<endl;
    
    //~ cout << t1.enAlza()<<endl;
    //~ cout << t1.enAlza()<<endl;
    //~ cout << t1.nombre()<<endl;
    //~ cout << t1.maxAcciones()<<endl;
    
    //~ Promesa p1("ypf",true,15, 4 );
    //~ 
    //~ cout <<p1<<endl;
    
    
    tupla<Cliente, string> t6(1,"a");
    tupla<Cliente, string> t2(13,"b");
    tupla<Cliente, string> t3(15,"e");
    tupla<Cliente, string> t7(12,"g");
    tupla<Cliente, string> t4(5,"k");
    tupla<Cliente, string> t5(17,"p");
    
    Lista<tupla<Cliente, string> > l;
    
    l.AgregarAtras(t6);
    l.AgregarAtras(t2);
    l.AgregarAtras(t3);
    l.AgregarAtras(t4);
    l.AgregarAtras(t5);
    l.AgregarAtras(t7);
 //~ 
	diccarray<string> d1(l, l.Longitud());
	//~ cout << l <<endl;
    //~ d1.diccarrayF(l, l.Longitud());
    //~ Cliente cli=20;
    //~ cout << "Definido:20? " << d1.definido(cli) << endl;
    //~ cout << "Definido:5? " << d1.definido(5) << endl;
    //~ cout << "sign:5? " << d1.obtener(5) << endl;
    //~ 
    //~ cout << "Test Dicctrie" << endl;
     
    
    
    Conj<Cliente> cs;
    //~ 
    cs.AgregarRapido(3);
    cs.AgregarRapido(4);
    cs.AgregarRapido(5);
    cs.AgregarRapido(33);
    cs.AgregarRapido(39);
    cs.AgregarRapido(9);
    cs.AgregarRapido(79);
    cout <<"*******************"<<endl;
    cout <<"*********WOLFIE**********"<<endl;
    //~ 
    wolfie w1(cs);
    
    //~ cout <<"salio" <<endl;
    //~ conjheap<InfoCliente> a(10);
//~ 
    //~ InfoCliente testn;
    //~ testn.n = 2;    testn.c = 8;    testn.p = 10;
    //~ InfoCliente test1;
    //~ testn.n = 24;    testn.c = 3;    testn.p = 10;
    //~ InfoCliente test2;
    //~ testn.n = 25;    testn.c = 5;    testn.p = 10;
    //~ a.Agregrar(testn);
    //~ a.Agregrar(test1);
    //~ a.Agregrar(test2);
    //~ cout<< a.Sacar()<<endl;
    //~ cout<< a.Sacar()<<endl;
    //~ cout<< a.Sacar()<<endl;
//~ 
    //~ 
    Nombre nt1="ypf";
    Nombre nt2="facebook";
    Nombre nt3="google";
    Nombre nt4="cepita";
    Dinero d0= 4;
    Dinero d2= 6;
    Dinero d3= 14;
    Dinero d4= 7;
    
    Titulo tit1(nt1,d0,23);
    Titulo tit2(nt2,d2,68);
    Titulo tit3(nt3,d3,978);
    Titulo tit4(nt4,d4,364);
    //~ 
    //~ cout<<"Titulo prueba:" <<endl;
    //~ cout << "titulo: " << tit1<<endl;
    //~ cout << "titulo: " << tit2<<endl;
    //~ cout << "titulo: " << tit3<<endl;
    //~ cout << "titulo: " << tit4<<endl;
    w1.agregarTitulo(tit1);
    w1.agregarTitulo(tit2);
    w1.agregarTitulo(tit3);
    w1.agregarTitulo(tit4);
    //~ 
    Conj<Titulo>::const_Iterador Ittt = w1.titulos();
    
    //~ while(Ittt.HaySiguiente()){
		//~ cout << Ittt.Siguiente() << endl;
		//~ Ittt.Avanzar();
		//~ 
	//~ }
    //~ cout <<"Finnnnnnnnnnnn1" <<endl;
    
    Promesa p2("cepita", COMPRA,10,12);
    Promesa p5("facebook", COMPRA,10,11);
    Promesa p3("facebook", COMPRA,4,21);
    //~ ****************
    
    Promesa p1("cepita", VENTA,10,6);
    Promesa p4("facebook", VENTA,10,2);
    Promesa p6("facebook", VENTA,10,5);
    
    //Compras
    w1.agregarPromesa(3,p3); //facebook ->21
    w1.agregarPromesa(4,p2); //cepita ->12
    w1.agregarPromesa(4,p5); //facebook ->11
    
    cout<<"precio actual de facebook es 10 "<<endl;
    cout<<"precio actual de cepita es 11 "<<endl;
    //si el precio baja ejecuta las de venta
    //si el precio sube ejecuta las de compras
    w1.actualizarCotizacion("facebook", 11);
    w1.actualizarCotizacion("cepita", 11);
    //se deberia ejecutar la del cliente 3
    //~ y deberia seguir estando el cliente 4

	cout<<"precio actual de facebook es 11 "<<endl;
	
	cout << "acciones de fb del cliente 3:" << w1.accionesPorClientes(3,"facebook") <<endl;
	cout << "acciones de fb del cliente 4:" << w1.accionesPorClientes(4,"facebook") <<endl;
	
	//~ Conj<Promesa>::const_Iterador itpc3 = w1.promesasDe(4);
	//~ 
	//~ while(itpc3.HaySiguiente()){
		//~ 
		//~ cout<< itpc3.Siguiente() <<endl;
		//~ itpc3.Avanzar();
		//~ 
	//~ }
	//~ cout<<"***********"<<endl;
	w1.actualizarCotizacion("cepita", 11);
	cout << "acciones de cepita del cliente 4:" << w1.accionesPorClientes(4,"cepita") <<endl;
	
	cout<<"****_____fin de compra_____******"<<endl;
	
	cout<<"****_____ventas!!!!!!!!!!_____******"<<endl;
	
	//Se ejecutan las de ventas
	//~ cout << "acciones de fb del cliente 3:" << w1.accionesPorClientes(3,"facebook") <<endl;
	w1.agregarPromesa(3,p4); //facebook  vende 2
	//~ cout << "acciones de fb del cliente 3:" << w1.accionesPorClientes(3,"facebook") <<endl;
	cout <<"****************"<<endl;
	
    cout << "acciones de cepita del cliente 4:" << w1.accionesPorClientes(4,"cepita") <<endl;
    w1.agregarPromesa(4,p1); //cepita vende 6
    //~ cout << "acciones de cepita del cliente 4:" << w1.accionesPorClientes(4,"cepita") <<endl;
    w1.agregarPromesa(4,p6); //facebook vende 5
	
	w1.actualizarCotizacion("facebook", 9);
	cout<<"****_____cambio fb a cot 9____******"<<endl;
	
	cout << "acciones de fb del cliente 3:" << w1.accionesPorClientes(3,"facebook") << "...tengo q tener 19"<<endl;
	
	cout << "acciones de fb del cliente 4:" << w1.accionesPorClientes(4,"facebook") <<"...tengo q tener 6"<<endl;
	
	
	w1.actualizarCotizacion("cepita", 9);
	cout<<"****_____cambio cepita a cot 9____******"<<endl;
	cout << "acciones de cepita del cliente 4:" << w1.accionesPorClientes(4,"cepita") <<"...tengo q tener 6"<<endl;
	
	
	//~ Conj<Promesa>::const_Iterador itpc = w1.promesasDe(3);
	
	//~ while(itpc.HaySiguiente()){
		//~ 
		//~ cout<< itpc.Siguiente() <<endl;
		//~ itpc.Avanzar();
		//~ 
	//~ }
	//~ cout<<"***********"<<endl;
	//~ cout<<"Promesas del cliente4 tiene cepita"<<endl;
	
	//~ Conj<Promesa>::const_Iterador itpc2 = w1.promesasDe(4);
	
	//~ while(itpc2.HaySiguiente()){
		//~ 
		//~ cout<< itpc2.Siguiente() <<endl;
		//~ itpc2.Avanzar();
		//~ 
	//~ }
    //~ cout<<"***********"<<endl;
    
    //~ cout << "acciones de fb del cliente 3:" << w1.accionesPorClientes(3,"facebook") <<endl;
    //~ cout << "acciones de fb del cliente 4:" << w1.accionesPorClientes(4,"facebook") <<endl;
	//~ Conj<Titulo>::const_Iterador Ittt2 = w1.titulos();
    //~ 
    //~ while(Ittt2.HaySiguiente()){
		//~ cout << Ittt2.Siguiente() << endl;
		//~ Ittt2.Avanzar();
		//~ 
	//~ }
    cout <<"Finnnnnnnnnnnn2" <<endl;
    //~ 
    return 0;
}
